package com.mercadoutils.domain;

import java.io.IOException;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import com.mercadolibre.sdk.Meli;
import com.mercadolibre.sdk.MeliException;
import com.ning.http.client.Response;

public class Category {
	
	public Category(){}
	
	public static String updateCategorias(Meli m, String categoria) throws MeliException, IOException{		
		if(categoria.equals(""))
			return obtenerPath(m);
		else{
			Response r = m.get("/categories/"+categoria+"?attributes=children_categories");
			String resultado = r.getResponseBody().toString();
			JsonElement jelement = new JsonParser().parse(resultado); 
			JsonObject jobject = jelement.getAsJsonObject();
			if(chequearHoja(jobject, m)==true)
				return "<input align=\"center\" type=\"submit\" value=\"Publicar\" class=\"btn btn-primary\" style=\"display: inline;\" onclick=\"setTextBox('"+jobject.get("name").getAsString()+"','"+jobject.get("id").getAsString()+"')\">";
			else
				return obtenerInfoCategoria(m, categoria);
//			Response r = m.get("/categories/"+categoria+"?attributes=path_from_root");
//			String resultado = r.getResponseBody().toString();
//			JsonElement jelement = new JsonParser().parse(resultado); 
//			JsonObject jobject2 = jelement.getAsJsonObject();
//			JsonArray jarray = jobject2.get("path_from_root").getAsJsonArray();
//			String resultadoParcial = null;
//			JsonObject jobject = null;
//			JsonArray jarrayInterno = null;
//			for (int i = jarray.size();i>=0;i--){
//				if(i!=0){
//					jobject = jarray.get(i-1).getAsJsonObject();
//					jarrayInterno = obtenerInfoCategoria(m, jobject.get("id").getAsString());
//				}
//				if(i!=0&&i<jarray.size()){
//					resultadoParcial += addHijo(m,jarrayInterno,jarray.get(i).getAsJsonObject().get("id").getAsString(), false,false,resultadoParcial);
//					System.out.println("entro por el if");
//				}
//				else{
//					if(i==0){//llego al path
//						resultadoParcial += addHijo(m,path,jarray.get(i).getAsJsonObject().get("id").getAsString(), true,false,resultadoParcial);
//						System.out.println("entro por el if 2");
//					}
//					else{//es el ultimo elegido por el usuario
//						System.out.println("entro por el else");
//						resultadoParcial += addHijo(m,jarrayInterno,jarray.get(i-1).getAsJsonObject().get("id").getAsString(), false,true,resultadoParcial);
//						
//					}
//				}				
//			}
//			return resultadoParcial;
		}
	}
	
	private static String obtenerPath(Meli m) throws MeliException, IOException{
		Response r = m.get("/sites/MLA/categories");
		String resultado = r.getResponseBody().toString();
		JsonElement jelement = new JsonParser().parse(resultado); 
	    JsonArray jarray = jelement.getAsJsonArray();
//	    return jarray;
	    return convertJArrayToHtml(jarray,m);
	}
	
	private static String obtenerInfoCategoria(Meli m, String categoria) throws MeliException, IOException{
		//ver como sacar las comillas de lo que me devuelve mercadolibre
		Response r = m.get("/categories/"+categoria+"?attributes=children_categories");
		String resultado = r.getResponseBody().toString();
		JsonElement jelement = new JsonParser().parse(resultado); 
		JsonObject jobject = jelement.getAsJsonObject();
		JsonArray jarray = jobject.get("children_categories").getAsJsonArray();
//		return jarray;
		return convertJArrayToHtml(jarray,m);
	}
	
	private static String convertJArrayToHtml(JsonArray jarray,Meli m) throws MeliException, IOException{
		String resultado = "<div class=\"dd\" id=\"nestable\"><ol class=\"dd-list\">";
		for(int i = 0;i<jarray.size();i++){
			JsonObject jobject = jarray.get(i).getAsJsonObject();
				resultado += "<li class=\"dd-item\" data-id=\""+jobject.get("id").getAsString()+"\"><div class=\"dd-handle\"><a href=\"#\" onclick=\"doAjaxPost('"+jobject.get("id").getAsString()+"')\">"+jobject.get("name").toString()+"</a></div></li>";
		}
		resultado+="</ol>";
		return resultado;
	}
	
	private static boolean chequearHoja(JsonObject jsonobject, Meli m) throws MeliException, IOException{
		
		Response r = m.get("/categories/"+jsonobject.get("id").getAsString());
		String resultado = r.getResponseBody().toString();
		JsonElement jelement = new JsonParser().parse(resultado); 
		JsonObject jobject = jelement.getAsJsonObject();
		JsonArray jarray = jobject.get("children_categories").getAsJsonArray();
		if(jarray.size()==0)
			return true;
		else
			return false;
	}
	
//	private static String addHijo(Meli m,JsonArray jarray, String id, boolean isPath,boolean isLeaf,String resultadoParcial){
//		//es el ultimo elegido por el usuario
//		if(isLeaf==true){
//			String resultado = "<ol class=\"dd-list\">";
//			for(int i = 0;i<jarray.size();i++){
//				JsonObject jobject = jarray.get(i).getAsJsonObject();
//				resultado += "<li class=\"dd-item\" data-id=\""+jobject.get("id").getAsString()+"\"><div class=\"dd-handle\"><a href=\"http://localhost:8080/MercadoUtils/category.html?id="+jobject.get("id").getAsString()+"\">"+jobject.get("name").toString()+"</a></div></li>";
//			}
//			resultado+="</ol>";
//			return resultado;
//		}
//		else{
//			//llego al path
//			if(isPath==true){
//				String resultado = "<div class=\"dd\" id=\"nestable\"><ol class=\"dd-list\">";
//				for(int i = 0;i<jarray.size();i++){
//					JsonObject jobject = jarray.get(i).getAsJsonObject();
//					if(jobject.get("id").getAsString().equals(id))
//						resultado += "<li class=\"dd-item\" data-id=\""+jobject.get("id").getAsString()+"\"><div class=\"dd-handle\"><a href=\"http://localhost:8080/MercadoUtils/category.html?id="+jobject.get("id").getAsString()+"\">"+jobject.get("name").toString()+"</a></div>"+resultadoParcial+"</li>";
//					else
//						resultado += "<li class=\"dd-item\" data-id=\""+jobject.get("id").getAsString()+"\"><div class=\"dd-handle\"><a href=\"http://localhost:8080/MercadoUtils/category.html?id="+jobject.get("id").getAsString()+"\">"+jobject.get("name").toString()+"</a></div></li>";
//				}
//				resultado+="</ol>";
//				System.out.println(resultado);
//				return resultado;
//			}
//			else{
//				String resultado = "<ol class=\"dd-list\">";
//				for(int i = 0;i<jarray.size();i++){
//					JsonObject jobject = jarray.get(i).getAsJsonObject();
//					System.out.println("el id recibido = "+id+" el id del json = "+jobject.get("id").getAsString());
//					if(jobject.get("id").getAsString().equals(id)){
//						resultado += "<li class=\"dd-item\" data-id=\""+jobject.get("id").getAsString()+"\"><div class=\"dd-handle\"><a href=\"http://localhost:8080/MercadoUtils/category.html?id="+jobject.get("id").getAsString()+"\">"+jobject.get("name").toString()+"</a></div>"+resultadoParcial+"</li>";
//						System.out.println("control de entrada");
//					}
//					else
//						resultado += "<li class=\"dd-item\" data-id=\""+jobject.get("id").getAsString()+"\"><div class=\"dd-handle\"><a href=\"http://localhost:8080/MercadoUtils/category.html?id="+jobject.get("id").getAsString()+"\">"+jobject.get("name").toString()+"</a></div></li>";
//				}
//				resultado+="</ol>";
//				return resultado;
//			}
//		}
//		
//	}
	
}








//
//
//
//package consultingPackage;
//
//import java.io.IOException;
// 
//import java.text.DateFormat;
//import java.text.SimpleDateFormat;
//import java.util.ArrayList;
//import java.util.Date;
//import java.util.Iterator;
//import java.util.LinkedList;
//import java.util.TimerTask;
// 
//import org.json.simple.JSONArray;
//import org.json.simple.JSONObject;
//import org.json.simple.parser.JSONParser;
//import org.json.simple.parser.ParseException;
// 
//import wrapperPackage.WrapperItems;
// 
//import com.mercadolibre.sdk.Meli;
//import com.mercadolibre.sdk.MeliException;
//import com.ning.http.client.Response;
// 
//import daoClasses.DAORecords_MySQL;
// 
//public class Categories extends TimerTask{
//       
//        Category [] category;
//        private Meli m = new Meli(1446274906831857L, "rnT2BpdRLJALy2E2cahxbYe2wW4ZylBu");
//        static DateFormat hourFormat = new SimpleDateFormat("HH:mm:ss");
//        static Date date;
//       
//        //This array will contain all the threads running
//        Thread [] threads;
//       
//        int attempts;
//       
//        public Categories(){
//               
//        }
//       
//        @Override
//        public void run() {
//                // TODO Auto-generated method stub
//                getRootCategories();
//        }
//       
//        public void getRootCategories(){
//                Response response;
//                date = new Date();
//                TxtExporter.getInstance().writeReport("-----------------------------------------------");
//                TxtExporter.getInstance().writeReport("Hora inicio de proceso: " + hourFormat.format(date));
//                TxtExporter.getInstance().writeReport("-----------------------------------------------");
//               
//                try {
//                        response = m.get("/sites/MLA/categories");
//                        JSONParser parser = new JSONParser();
//                        Object obj = parser.parse(response.getResponseBody());
//                        ArrayList categoriesJsonArray = (ArrayList) obj;
//                       
//                        //categories = new Categories(categoriesJsonArray);
//                       
//                        Iterator<String> iterator = categoriesJsonArray.iterator();
//                        int i = 0;
//                       
//                        //Set the size of the array with categories quantity.
//                        //this.category = new Category[categoriesJsonArray.size()];
//                       
//                        threads = new Thread[categoriesJsonArray.size()];
//                       
//                        while(iterator.hasNext()){
//                                iterator.next();
//                                Thread thread = new Thread(new Category((JSONObject) categoriesJsonArray.get(i)));
//                                threads[i] = thread;
//                                i++;
//                        }
//                       
//                        for(int j=0;j<threads.length;j++){
//                                threads[j].start();
//                        }
//                        for(int j=0;j<threads.length;j++){
//                                try {
//                                        threads[j].join();
//                                } catch (InterruptedException e) {
//                                        // TODO Auto-generated catch block
//                                        e.printStackTrace();
//                                }
//                        }
//                       
//                       
//                } catch (MeliException e) {
//                        if(attempts <= 10000){
//                                try {
//                                        Thread.sleep(1000);
//                                } catch (InterruptedException e1) {
//                                        // TODO Auto-generated catch block
//                                        getRootCategories();
//                                        e1.printStackTrace();
//                                }
//                                System.out.println("new attempts");
//                                attempts++;
//                                getRootCategories();
//                        }
//                        // TODO Auto-generated catch block
//                        e.printStackTrace();
//                } catch (ParseException e) {
//                        // TODO Auto-generated catch block
//                        e.printStackTrace();
//                } catch (IOException e) {
//                        // TODO Auto-generated catch block
//                        e.printStackTrace();
//                }
//               
//                date = new Date();
//                TxtExporter.getInstance().writeReport("-----------------------------------------------");
//                TxtExporter.getInstance().writeReport("Hora termino de proceso: " + hourFormat.format(date));
//                TxtExporter.getInstance().writeReport("-----------------------------------------------");
//                System.out.println("Termino de proceso: " + hourFormat.format(date));
//               
//        }
//       
//        public class Category extends Thread{
//               
//                //Stack to contain fathers.
//                private LinkedList<String> fifoFathers = new LinkedList<String>();
//                //This stack will contain a column to indicate the father and a column to indicate the son, to register the relationship
//                private LinkedList<String[]> fifoRelationship = new LinkedList<String[]>();
//                //Stack to contain the childrens
//                private LinkedList<String[]> fifoChildrens = new LinkedList<String[]>();
//                //Stack to store the categories leafs
//                private LinkedList<String> fifoLeafs = new LinkedList<String>();
//               
//                int attempts = 0;
//                private JSONObject jsonObject;
//               
//                public Category(JSONObject category){
//                       
//                        jsonObject = category;
//                }
//               
//                public void run(){
//                        System.out.println("CategoriaId: " + jsonObject.get("id") + " ,Nombre: " + jsonObject.get("name"));
//                        fifoFathers.push((String) jsonObject.get("id"));
// 
//                        while(fifoFathers.size() > 0){
//                                getChildrens(fifoFathers.pop());
//                        }
//                       
//                        storeRelationship();
//                       
//                        Thread thread = new Thread(new Calculate());
//                        thread.setName("2da hebra" + jsonObject.get("name"));
//                        thread.start();
//                       
//                        try {
//                                thread.join();
//                        } catch (InterruptedException e) {
//                                // TODO Auto-generated catch block
//                                e.printStackTrace();
//                        }
//                       
//                        System.out.println(Thread.currentThread().getId() + " -> closed");
//                        Thread.currentThread().interrupt();
//                        return;
//                }
//               
//                public void getChildrens(String categoryId){
//                       
//                        try {
//                                Response response = m.get("/categories/"+ categoryId);
//                                JSONParser parser = new JSONParser();
//                                Object obj = parser.parse(response.getResponseBody());
//                                //childrenJsonObject will contain the fathers at first level
//                                JSONObject categoryJsonObject = (JSONObject) obj;
//                                JSONArray childrens = (JSONArray) categoryJsonObject.get("children_categories");
//                               
//                                TxtExporter.getInstance().writeReport("---Buscando: " + categoryId + " , " +categoryJsonObject.get("name"));
//                                TxtExporter.getInstance().writeReport("---Tamaño de la pila:" + fifoFathers.size());
//                                TxtExporter.getInstance().writeReport("-------------------------------------------------");
//                               
//                                fifoChildrens.push(new String[]{(String) categoryJsonObject.get("id"),(String) categoryJsonObject.get("name")});
//                               
//                                if(childrens.size() > 0){
//                                        Iterator<String> iterator = childrens.iterator();
//                                        int i = 0;
//                                        while(iterator.hasNext()){
//                                                iterator.next();
//                                                //Instance a children for each children in the category.
//                                                JSONObject children = (JSONObject) childrens.get(i);
//                                                fifoFathers.push((String) children.get("id"));
//                                                fifoRelationship.push(new String[]{(String) children.get("id"), (String) categoryJsonObject.get("id") ,
//                                                                                                        (String) categoryJsonObject.get("name"), (String) children.get("name")});
//                                                i++;
//                                        }
//                                }else{
//                                        fifoLeafs.push((String) categoryJsonObject.get("id"));
//                                        return;
//                                }
//                               
//                        } catch (MeliException e) {
//                                if(attempts <= 10000){
//                                        try {
//                                                Thread.sleep(1000);
//                                        } catch (InterruptedException e1) {
//                                                // TODO Auto-generated catch block
//                                                getChildrens(categoryId);
//                                                e1.printStackTrace();
//                                        }
//                                        System.out.println("new attempt: " + categoryId);
//                                        attempts++;
//                                        getChildrens(categoryId);
//                                }
//                                // TODO Auto-generated catch block
//                                e.printStackTrace();
//                        } catch (ParseException e) {
//                                // TODO Auto-generated catch block
//                                e.printStackTrace();
//                        } catch (IOException e) {
//                                // TODO Auto-generated catch block
//                                e.printStackTrace();
//                        }
//                        return;
//                }
//               
//                public void storeRelationship(){
//                        DateFormat hourFormat = new SimpleDateFormat("HH:mm:ss");
//                        Date date = new Date();
//                        boolean isLeaf;
//                       
//                        TxtExporter.getInstance().writeReport("Comienzo a guardar las relaciones de padre/hijo en la base de datos. Hora: " + hourFormat.format(date));
//                        for(int j = 0;j<fifoRelationship.size();j++){
//                               
//                               
//                                TxtExporter.getInstance().writeReport("-----------------------------------------");
//                                TxtExporter.getInstance().writeReport("Insertando relacion en la base de datos");
//                                TxtExporter.getInstance().writeReport("ChildrenId: " + fifoRelationship.get(j)[0]);
//                                TxtExporter.getInstance().writeReport("FatherId: " + fifoRelationship.get(j)[1]);
//                                TxtExporter.getInstance().writeReport("Children name: " + fifoRelationship.get(j)[3]);
//                                TxtExporter.getInstance().writeReport("Father name: " + fifoRelationship.get(j)[2]);
//                                TxtExporter.getInstance().writeReport("-----------------------------------------");
//                               
//                                isLeaf = false;
//                                //Indicate if the children in this relationship is a leaf
//                                if(fifoLeafs.contains(fifoRelationship.get(j)[0])){
//                                        isLeaf = true;
//                                }
//                                //Save the relationships
//                                DAORecords_MySQL daoRecords = DAORecords_MySQL.getInstance();
//                                daoRecords.insertRelationship(fifoRelationship.get(j)[0], fifoRelationship.get(j)[1], fifoRelationship.get(j)[2], fifoRelationship.get(j)[3], isLeaf);
//                        }
//                       
//                       
//                }
//               
//                public class Calculate extends Thread{
//                       
//                        WrapperItems itemsPerCategory;
//                       
//                        public void run(){
//                               
//                                DateFormat hourFormat = new SimpleDateFormat("HH:mm:ss");
//                                Date date = new Date();
//                                TxtExporter.getInstance().writeReport("Comienzo a guardar en la base de datos los promedios, maximos y minimos de cada categoria. Hora : " + hourFormat.format(date));
//                               
//                                for(int i=0;i<fifoChildrens.size();i++){
//                                        this.obtainChildrensItems(fifoChildrens.get(i)[0],fifoChildrens.get(i)[1]);
//                                }
//                               
//                                System.out.println("Muerte " + Thread.currentThread().getName());
//                                Thread.currentThread().interrupt();
//                                return;
//                        }
//                       
//                        public void obtainChildrensItems(String childrenId, String childrenName){
//                               
//                                ConsultAPI consult = ConsultAPI.getInstance();
//                                itemsPerCategory = consult.getItemsPerCategory(childrenId);
//                                calculateAverages(itemsPerCategory, childrenId, childrenName);
//                               
//                        }
//                       
//                        public void calculateAverages(WrapperItems items, String childrenId, String childrenName){
//                               
//                                double maxPrice = 0, minPrice = 0, averagePrice = 0, sumPrices = 0;
//                                int count = 0;
//                                for(int i=0;i<items.getResults().length;i++){
//                                       
//                                        //The condition can be null, in for example "cosmetologia"
//                                        if(items.getResults()[i].getCondition() == null || items.getResults()[i].getCondition().contains("new")){
//                                               
//                                                count++;
//                                                sumPrices = sumPrices + items.getResults()[i].getPrice();
//                                               
//                                                if(maxPrice < items.getResults()[i].getPrice()){
//                                                        maxPrice = items.getResults()[i].getPrice();
//                                                }
//                                                if(minPrice > items.getResults()[i].getPrice() || i==0){
//                                                        minPrice = items.getResults()[i].getPrice();
//                                                }
//                                        }
//                                }
//                               
//                                //Obtain average
//                                if(sumPrices == 0){
//                                        averagePrice = 0;
//                                }else{
//                                        averagePrice = sumPrices/count;
//                                }
//                               
//                                storeCalculation(childrenId, childrenName ,maxPrice, minPrice, averagePrice);
//                        }
//                       
//                        public void storeCalculation(String childrenId, String childrenName ,double maxPrice, double minPrice, double averagePrice){
//                               
//                                TxtExporter.getInstance().writeReport("--------------------------------------");
//                                TxtExporter.getInstance().writeReport("Insertando en la base de datos los items de la categoria: " + childrenId);
//                                TxtExporter.getInstance().writeReport("Precio minimo: " + minPrice);
//                                TxtExporter.getInstance().writeReport("Promedio precios: " + averagePrice);
//                               
//                                //Save the calculated data
//                                DAORecords_MySQL daoRecords = DAORecords_MySQL.getInstance();
//                                daoRecords.insertRecord(childrenId, childrenName ,averagePrice, maxPrice, minPrice);
//                                TxtExporter.getInstance().writeReport("Hecho");
//                                TxtExporter.getInstance().writeReport("--------------------------------------");
//                        }
//                }
//               
//        }
// 
//}